{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们使用tensorflow来实现一个简单的手写数字识别的网络，并用这个网络来做个 简单的识别示例。\n",
    "\n",
    "本作业中，需要参与者应用视频中学到的知识：dropout，learingratedecay，初始化等等，将网络最终在validation数据上的得分尽可能的提高。\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "首先导入一些用到的库。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "tf.logging.set_verbosity(tf.logging.INFO)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "先看数据的形状"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting ./train-images-idx3-ubyte.gz\n",
      "Extracting ./train-labels-idx1-ubyte.gz\n",
      "Extracting ./t10k-images-idx3-ubyte.gz\n",
      "Extracting ./t10k-labels-idx1-ubyte.gz\n",
      "(55000, 784)\n",
      "(55000,)\n",
      "(5000, 784)\n",
      "(5000,)\n",
      "(10000, 784)\n",
      "(10000,)\n"
     ]
    }
   ],
   "source": [
    "mnist = input_data.read_data_sets(\"./\")\n",
    "\n",
    "print(mnist.train.images.shape)\n",
    "print(mnist.train.labels.shape)\n",
    "\n",
    "print(mnist.validation.images.shape)\n",
    "print(mnist.validation.labels.shape)\n",
    "\n",
    "print(mnist.test.images.shape)\n",
    "print(mnist.test.labels.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "\n",
    "可以看到images里面有数量不等的图片，每张图片是28x28长度的一个一维向量， 所以用的时候需要先给它还原成28x28的二维图片。labels中则是图片对应的数字的值。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8,8))\n",
    "\n",
    "for idx in range(16):\n",
    "    plt.subplot(4,4, idx+1)\n",
    "    plt.axis('off')\n",
    "    plt.title('[{}]'.format(mnist.train.labels[idx]))\n",
    "    plt.imshow(mnist.train.images[idx].reshape((28,28)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来，定义用于训练的网络，首先定义网络的输入。\n",
    "这里我们直接使用上面的数据作为输入，所以定义两个placeholder分别用于图像和lable数据，另外，定义一个float类型的变量用于设置学习率。\n",
    "为了让网络更高效的运行，多个数据会被组织成一个batch送入网络，两个placeholder的第一个维度就是batchsize，因为我们这里还没有确定batchsize，所以第一个维度留空。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = tf.placeholder(\"float\", [None, 784])\n",
    "y = tf.placeholder(\"int64\", [None])\n",
    "learning_rate = tf.placeholder(\"float\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "truncated_normal从随机分布中截取一段数据，将超过阈值的一些数据删除"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [],
   "source": [
    "def initialize(shape, stddev=0.1):\n",
    "  return tf.truncated_normal(shape, stddev=0.1)\n",
    "L1_units_count = 100\n",
    "\n",
    "W_1 = tf.Variable(initialize([784, L1_units_count],stddev=0.05))\n",
    "b_1 = tf.Variable(initialize([L1_units_count]))\n",
    "logits_1 = tf.matmul(x, W_1) + b_1\n",
    "output_1 = tf.nn.relu(logits_1)\n",
    "\n",
    "L2_units_count = 10 \n",
    "W_2 = tf.Variable(initialize([L1_units_count, L2_units_count],stddev=0.063))\n",
    "b_2 = tf.Variable(initialize([L2_units_count]))\n",
    "logits_2 = tf.matmul(output_1, W_2) + b_2  \n",
    "\n",
    "logits = logits_2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来定义loss和用于优化网络的优化器。loss计算使用了sparse_softmax_cross_entropy_with_logits（首先进行softmax，再进行交叉熵）, 这样做的好处是labels可以不用手动做one_hot省了一些麻烦。这里使用了sgd优化器，学习率为可以根据需要设定。（logits是神经网络未经激活的输出）\n",
    "GradientDescentOptimizer 采用梯度下降法根据学习率最小化损失函数cross_entropy_loss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [],
   "source": [
    "cross_entropy_loss = tf.reduce_mean(\n",
    "    tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=y))\n",
    "\n",
    "optimizer = tf.train.GradientDescentOptimizer(\n",
    "    learning_rate=learning_rate).minimize(cross_entropy_loss)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "需要 注意的是，上面的网络，最后输出的是未经softmax的原始logits，而不是概率分布， 要想看到概率分布，还需要做一下softmax。\n",
    "将输出的结果与正确结果进行对比，即可得到我们的网络输出结果的准确率。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [],
   "source": [
    "pred = tf.nn.softmax(logits)\n",
    "correct_pred = tf.equal(tf.argmax(pred, 1), y)\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "saver用于保存或恢复训练的模型。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [],
   "source": [
    "batch_size = 32\n",
    "trainig_step = 1000\n",
    "\n",
    "saver = tf.train.Saver()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "以上定义的所有操作，均为计算图，也就是仅仅是定义了网络的结构，实际需要运行的话，还需要创建一个session，并将数据填入网络中。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after 100 training steps, the loss is 0.290426, the validation accuracy is 0.881\n",
      "after 200 training steps, the loss is 0.449923, the validation accuracy is 0.911\n",
      "after 300 training steps, the loss is 0.184466, the validation accuracy is 0.9282\n",
      "after 400 training steps, the loss is 0.238371, the validation accuracy is 0.9308\n",
      "after 500 training steps, the loss is 0.173254, the validation accuracy is 0.9384\n",
      "after 600 training steps, the loss is 0.355033, the validation accuracy is 0.9392\n",
      "after 700 training steps, the loss is 0.0985999, the validation accuracy is 0.9474\n",
      "after 800 training steps, the loss is 0.0688295, the validation accuracy is 0.9528\n",
      "after 900 training steps, the loss is 0.0351038, the validation accuracy is 0.9544\n",
      "the training is finish!\n",
      "the test accuarcy is: 0.9496\n"
     ]
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "\n",
    "    #定义验证集与测试集\n",
    "    validate_data = {\n",
    "        x: mnist.validation.images,\n",
    "        y: mnist.validation.labels,\n",
    "    }\n",
    "    test_data = {x: mnist.test.images, y: mnist.test.labels}\n",
    "\n",
    "    for i in range(trainig_step):\n",
    "        xs, ys = mnist.train.next_batch(batch_size)\n",
    "        _, loss = sess.run(\n",
    "            [optimizer, cross_entropy_loss],\n",
    "            feed_dict={\n",
    "                x: xs,\n",
    "                y: ys,\n",
    "                learning_rate: 0.3\n",
    "            })\n",
    "\n",
    "        #每100次训练打印一次损失值与验证准确率\n",
    "        if i > 0 and i % 100 == 0:\n",
    "            validate_accuracy = sess.run(accuracy, feed_dict=validate_data)\n",
    "            print(\n",
    "                \"after %d training steps, the loss is %g, the validation accuracy is %g\"\n",
    "                % (i, loss, validate_accuracy))\n",
    "            saver.save(sess, './model.ckpt', global_step=i)\n",
    "\n",
    "    print(\"the training is finish!\")\n",
    "    #最终的测试准确率\n",
    "    acc = sess.run(accuracy, feed_dict=test_data)\n",
    "    print(\"the test accuarcy is:\", acc)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "下面，用我们训练的模型做一个测试。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:Restoring parameters from ./model.ckpt-900\n",
      "0.9375\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    ckpt = tf.train.get_checkpoint_state('./')\n",
    "    if ckpt and ckpt.model_checkpoint_path:\n",
    "        saver.restore(sess, ckpt.model_checkpoint_path)\n",
    "        final_pred, acc = sess.run(\n",
    "            [pred, accuracy],\n",
    "            feed_dict={\n",
    "                x: mnist.test.images[:16],\n",
    "                y: mnist.test.labels[:16]\n",
    "            })\n",
    "        orders = np.argsort(final_pred)\n",
    "        plt.figure(figsize=(8, 8))\n",
    "        print(acc)\n",
    "        for idx in range(16):\n",
    "            order = orders[idx, :][-1]\n",
    "            prob = final_pred[idx, :][order]\n",
    "            plt.subplot(4, 4, idx + 1)\n",
    "            plt.axis('off')\n",
    "            plt.title('{}: [{}]-[{:.1f}%]'.format(mnist.test.labels[idx],\n",
    "                                                  order, prob * 100))\n",
    "            plt.imshow(mnist.test.images[idx].reshape((28, 28)))\n",
    "\n",
    "    else:\n",
    "        pass"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "这里模型效果不够好的原因，是对激活函数、学习率进行优化，也没有加入正则项，对初始数据也没有进行dropout等操作。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
